/**
 * 配置
 * */
package org.zmhhxl.sample3.oauth2.a.configure;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.zmhhxl.sample3.oauth2.a.configure.properties.CorsProperties;

import java.util.Arrays;

/**
 * 启用跨域配置
 * @author Steve Riesenberg
 */
@Configuration
//@ConfigurationProperties(prefix = "custom.cors")
public class CorsConfig {

    // 外部配置 todo 待完成
    @Autowired
    private /*final*/ CorsProperties corsProperties ;

    @Bean
    public CorsConfigurationSource corsConfigurationSource() {

        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedHeader(CorsConfiguration.ALL); // 设置允许的源，根据实际情况调整
        config.addAllowedMethod("*");  //GET, POST, PUT, DELETE
        config.setAllowedOrigins(corsProperties.getAllowedOrigins()); //List.of()
        //config.addAllowedOrigin("http://127.0.0.1:4200");  //customSecurityProperties.getAllowedUrlsOrigin()
        //config.addAllowedOrigin("http://127.0.0.1:8090");
        config.setAllowCredentials(true);
        //config.addExposedHeader(CorsConfiguration.ALL);

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);

//        FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
//        bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
//        return bean;

        return source;
    }

    /**
     * 跨域过滤器配置
     *
     * @return CorsFilter
     */
//    @Bean
//    public CorsFilter corsFilter() {
//
//        // 初始化cors配置对象
//        CorsConfiguration configuration = new CorsConfiguration();
//
//        // 设置允许跨域的域名,如果允许携带cookie的话,路径就不能写*号, *表示所有的域名都可以跨域访问
//        //configuration.addAllowedOrigin("http://127.0.0.1:5173");
//        //configuration.addAllowedOrigin("http://192.168.1.102:5173");
//        //configuration.addAllowedOrigin("http://192.168.119.1:5173");
//        configuration.addAllowedOrigin("http://127.0.0.1:4200");
//        //configuration.addAllowedOrigin("http://127.0.0.1:8080");  //customSecurityProperties.getAllowedUrlsOrigin()
//        //configuration.addAllowedOrigin("http://127.0.0.1:8090");
//        // 设置跨域访问可以携带cookie
//        configuration.setAllowCredentials(true);
//        // 允许所有的请求方法 ==> GET POST PUT Delete
//        configuration.addAllowedMethod("*");
//        // 允许携带任何头信息
//        configuration.addAllowedHeader("*");
//
//        // 初始化cors配置源对象
//        UrlBasedCorsConfigurationSource configurationSource = new UrlBasedCorsConfigurationSource();
//
//        // 给配置源对象设置过滤的参数
//        // 参数一: 过滤的路径 == > 所有的路径都要求校验是否跨域
//        // 参数二: 配置类
//        configurationSource.registerCorsConfiguration("/**", configuration);
//
//        // 返回配置好的过滤器
//        return new CorsFilter(configurationSource);
//    }

    //@Bean  //不行
//    public CorsConfigurationSource corsConfigurationSource() {
//
//        // 1.添加cors配置信息
//        CorsConfiguration config = new CorsConfiguration();
//        //放行哪些原始域（头部信息）
//        config.addAllowedHeader("*");
//        //放行哪些原始域(请求方式,get,post等)
//        config.addAllowedMethod("*");
//        //放行哪些原始域
//        config.addAllowedOrigin("http://127.0.0.1:4200");  //http://127.0.0.1:4200
//        config.addAllowedOrigin("http://127.0.0.1:8080");
//        config.addAllowedOrigin("http://127.0.0.1:8090");
//        //是否发送cookie信息
//        config.setAllowCredentials(true);
//        //暴露哪些头部信息（因为跨域访问默认不能获取全部头部信息）
//        config.addExposedHeader("*");
//
//        // 2.添加映射路径
//        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
//        source.registerCorsConfiguration("/**", config);
//
//        return source;
//    }

}
